home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / Miro_Downloader.exe / webbrowser.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-11-12  |  17.3 KB  |  663 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''Interfaces for launching and remotely controlling Web browsers.'''
  5. import os
  6. import sys
  7. import stat
  8. import subprocess
  9. import time
  10. __all__ = [
  11.     'Error',
  12.     'open',
  13.     'open_new',
  14.     'open_new_tab',
  15.     'get',
  16.     'register']
  17.  
  18. class Error(Exception):
  19.     pass
  20.  
  21. _browsers = { }
  22. _tryorder = []
  23.  
  24. def register(name, klass, instance = None, update_tryorder = 1):
  25.     '''Register a browser connector and, optionally, connection.'''
  26.     _browsers[name.lower()] = [
  27.         klass,
  28.         instance]
  29.     if update_tryorder > 0:
  30.         _tryorder.append(name)
  31.     elif update_tryorder < 0:
  32.         _tryorder.insert(0, name)
  33.     
  34.  
  35.  
  36. def get(using = None):
  37.     '''Return a browser launcher instance appropriate for the environment.'''
  38.     if using is not None:
  39.         alternatives = [
  40.             using]
  41.     else:
  42.         alternatives = _tryorder
  43.     for browser in alternatives:
  44.         if '%s' in browser:
  45.             return GenericBrowser(browser.split())
  46.             continue
  47.         
  48.         try:
  49.             command = _browsers[browser.lower()]
  50.         except KeyError:
  51.             command = _synthesize(browser)
  52.  
  53.         if command[1] is not None:
  54.             return command[1]
  55.             continue
  56.         if command[0] is not None:
  57.             return command[0]()
  58.             continue
  59.     
  60.     raise Error('could not locate runnable browser')
  61.  
  62.  
  63. def open(url, new = 0, autoraise = 1):
  64.     for name in _tryorder:
  65.         browser = get(name)
  66.         if browser.open(url, new, autoraise):
  67.             return True
  68.             continue
  69.     
  70.     return False
  71.  
  72.  
  73. def open_new(url):
  74.     return open(url, 1)
  75.  
  76.  
  77. def open_new_tab(url):
  78.     return open(url, 2)
  79.  
  80.  
  81. def _synthesize(browser, update_tryorder = 1):
  82.     """Attempt to synthesize a controller base on existing controllers.
  83.  
  84.     This is useful to create a controller when a user specifies a path to
  85.     an entry in the BROWSER environment variable -- we can copy a general
  86.     controller to operate using a specific installation of the desired
  87.     browser in this way.
  88.  
  89.     If we can't create a controller in this way, or if there is no
  90.     executable for the requested browser, return [None, None].
  91.  
  92.     """
  93.     cmd = browser.split()[0]
  94.     if not _iscommand(cmd):
  95.         return [
  96.             None,
  97.             None]
  98.     
  99.     name = os.path.basename(cmd)
  100.     
  101.     try:
  102.         command = _browsers[name.lower()]
  103.     except KeyError:
  104.         return [
  105.             None,
  106.             None]
  107.  
  108.     controller = command[1]
  109.     if controller and name.lower() == controller.basename:
  110.         import copy
  111.         controller = copy.copy(controller)
  112.         controller.name = browser
  113.         controller.basename = os.path.basename(browser)
  114.         register(browser, None, controller, update_tryorder)
  115.         return [
  116.             None,
  117.             controller]
  118.     
  119.     return [
  120.         None,
  121.         None]
  122.  
  123. if sys.platform[:3] == 'win':
  124.     
  125.     def _isexecutable(cmd):
  126.         cmd = cmd.lower()
  127.         if os.path.isfile(cmd) and cmd.endswith(('.exe', '.bat')):
  128.             return True
  129.         
  130.         for ext in ('.exe', '.bat'):
  131.             if os.path.isfile(cmd + ext):
  132.                 return True
  133.                 continue
  134.         
  135.         return False
  136.  
  137. else:
  138.     
  139.     def _isexecutable(cmd):
  140.         if os.path.isfile(cmd):
  141.             mode = os.stat(cmd)[stat.ST_MODE]
  142.             if mode & stat.S_IXUSR and mode & stat.S_IXGRP or mode & stat.S_IXOTH:
  143.                 return True
  144.             
  145.         
  146.         return False
  147.  
  148.  
  149. def _iscommand(cmd):
  150.     '''Return True if cmd is executable or can be found on the executable
  151.     search path.'''
  152.     if _isexecutable(cmd):
  153.         return True
  154.     
  155.     path = os.environ.get('PATH')
  156.     if not path:
  157.         return False
  158.     
  159.     for d in path.split(os.pathsep):
  160.         exe = os.path.join(d, cmd)
  161.         if _isexecutable(exe):
  162.             return True
  163.             continue
  164.     
  165.     return False
  166.  
  167.  
  168. class BaseBrowser(object):
  169.     '''Parent class for all browsers. Do not use directly.'''
  170.     args = [
  171.         '%s']
  172.     
  173.     def __init__(self, name = ''):
  174.         self.name = name
  175.         self.basename = name
  176.  
  177.     
  178.     def open(self, url, new = 0, autoraise = 1):
  179.         raise NotImplementedError
  180.  
  181.     
  182.     def open_new(self, url):
  183.         return self.open(url, 1)
  184.  
  185.     
  186.     def open_new_tab(self, url):
  187.         return self.open(url, 2)
  188.  
  189.  
  190.  
  191. class GenericBrowser(BaseBrowser):
  192.     '''Class for all browsers started with a command
  193.        and without remote functionality.'''
  194.     
  195.     def __init__(self, name):
  196.         if isinstance(name, basestring):
  197.             self.name = name
  198.         else:
  199.             self.name = name[0]
  200.             self.args = name[1:]
  201.         self.basename = os.path.basename(self.name)
  202.  
  203.     
  204.     def open(self, url, new = 0, autoraise = 1):
  205.         cmdline = [] + [ arg.replace('%s', url) for arg in self.args ]
  206.         
  207.         try:
  208.             p = subprocess.Popen(cmdline, close_fds = True)
  209.             return not p.wait()
  210.         except OSError:
  211.             []
  212.             []
  213.             [
  214.                 self.name]
  215.             return False
  216.         except:
  217.             []
  218.  
  219.  
  220.  
  221.  
  222. class BackgroundBrowser(GenericBrowser):
  223.     '''Class for all browsers which are to be started in the
  224.        background.'''
  225.     
  226.     def open(self, url, new = 0, autoraise = 1):
  227.         cmdline = [] + [ arg.replace('%s', url) for arg in self.args ]
  228.         setsid = getattr(os, 'setsid', None)
  229.         
  230.         try:
  231.             p = subprocess.Popen(cmdline, close_fds = True, preexec_fn = setsid)
  232.             return p.poll() is None
  233.         except OSError:
  234.             None if not setsid else [
  235.                 self.name]
  236.             None if not setsid else [
  237.                 self.name]
  238.             return False
  239.         except:
  240.             None if not setsid else [
  241.                 self.name]
  242.  
  243.  
  244.  
  245.  
  246. class UnixBrowser(BaseBrowser):
  247.     '''Parent class for all Unix browsers with remote functionality.'''
  248.     raise_opts = None
  249.     remote_args = [
  250.         '%action',
  251.         '%s']
  252.     remote_action = None
  253.     remote_action_newwin = None
  254.     remote_action_newtab = None
  255.     background = False
  256.     redirect_stdout = True
  257.     
  258.     def _invoke(self, args, remote, autoraise):
  259.         raise_opt = []
  260.         if remote and self.raise_opts:
  261.             autoraise = int(bool(autoraise))
  262.             opt = self.raise_opts[autoraise]
  263.             if opt:
  264.                 raise_opt = [
  265.                     opt]
  266.             
  267.         
  268.         cmdline = [
  269.             self.name] + raise_opt + args
  270.         if remote or self.background:
  271.             inout = file(os.devnull, 'r+')
  272.         else:
  273.             inout = None
  274.         setsid = getattr(os, 'setsid', None)
  275.         if not setsid:
  276.             setsid = getattr(os, 'setpgrp', None)
  277.         
  278.         if not self.redirect_stdout or inout:
  279.             pass
  280.         p = subprocess.Popen(cmdline, close_fds = True, stdin = inout, stdout = None, stderr = inout, preexec_fn = setsid)
  281.         if remote:
  282.             time.sleep(1)
  283.             rc = p.poll()
  284.             if rc is None:
  285.                 time.sleep(4)
  286.                 rc = p.poll()
  287.                 if rc is None:
  288.                     return True
  289.                 
  290.             
  291.             return not rc
  292.         elif self.background:
  293.             if p.poll() is None:
  294.                 return True
  295.             else:
  296.                 return False
  297.         else:
  298.             return not p.wait()
  299.  
  300.     
  301.     def open(self, url, new = 0, autoraise = 1):
  302.         if new == 0:
  303.             action = self.remote_action
  304.         elif new == 1:
  305.             action = self.remote_action_newwin
  306.         elif new == 2:
  307.             if self.remote_action_newtab is None:
  308.                 action = self.remote_action_newwin
  309.             else:
  310.                 action = self.remote_action_newtab
  311.         else:
  312.             raise Error("Bad 'new' parameter to open(); " + 'expected 0, 1, or 2, got %s' % new)
  313.         args = [ arg.replace('%s', url).replace('%action', action) for arg in self.remote_args ]
  314.         success = self._invoke(args, True, autoraise)
  315.  
  316.  
  317.  
  318. class Mozilla(UnixBrowser):
  319.     '''Launcher class for Mozilla/Netscape browsers.'''
  320.     raise_opts = [
  321.         '-noraise',
  322.         '-raise']
  323.     remote_args = [
  324.         '-remote',
  325.         'openURL(%s%action)']
  326.     remote_action = ''
  327.     remote_action_newwin = ',new-window'
  328.     remote_action_newtab = ',new-tab'
  329.     background = True
  330.  
  331. Netscape = Mozilla
  332.  
  333. class Galeon(UnixBrowser):
  334.     '''Launcher class for Galeon/Epiphany browsers.'''
  335.     raise_opts = [
  336.         '-noraise',
  337.         '']
  338.     remote_args = [
  339.         '%action',
  340.         '%s']
  341.     remote_action = '-n'
  342.     remote_action_newwin = '-w'
  343.     background = True
  344.  
  345.  
  346. class Opera(UnixBrowser):
  347.     '''Launcher class for Opera browser.'''
  348.     raise_opts = [
  349.         '',
  350.         '-raise']
  351.     remote_args = [
  352.         '-remote',
  353.         'openURL(%s%action)']
  354.     remote_action = ''
  355.     remote_action_newwin = ',new-window'
  356.     remote_action_newtab = ',new-page'
  357.     background = True
  358.  
  359.  
  360. class Elinks(UnixBrowser):
  361.     '''Launcher class for Elinks browsers.'''
  362.     remote_args = [
  363.         '-remote',
  364.         'openURL(%s%action)']
  365.     remote_action = ''
  366.     remote_action_newwin = ',new-window'
  367.     remote_action_newtab = ',new-tab'
  368.     background = False
  369.     redirect_stdout = False
  370.  
  371.  
  372. class Konqueror(BaseBrowser):
  373.     '''Controller for the KDE File Manager (kfm, or Konqueror).
  374.  
  375.     See the output of ``kfmclient --commands``
  376.     for more information on the Konqueror remote-control interface.
  377.     '''
  378.     
  379.     def open(self, url, new = 0, autoraise = 1):
  380.         if new == 2:
  381.             action = 'newTab'
  382.         else:
  383.             action = 'openURL'
  384.         devnull = file(os.devnull, 'r+')
  385.         setsid = getattr(os, 'setsid', None)
  386.         if not setsid:
  387.             setsid = getattr(os, 'setpgrp', None)
  388.         
  389.         
  390.         try:
  391.             p = subprocess.Popen([
  392.                 'kfmclient',
  393.                 action,
  394.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull)
  395.         except OSError:
  396.             pass
  397.  
  398.         p.wait()
  399.         return True
  400.         
  401.         try:
  402.             p = subprocess.Popen([
  403.                 'konqueror',
  404.                 '--silent',
  405.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull, preexec_fn = setsid)
  406.         except OSError:
  407.             pass
  408.  
  409.         if p.poll() is None:
  410.             return True
  411.         
  412.         
  413.         try:
  414.             p = subprocess.Popen([
  415.                 'kfm',
  416.                 '-d',
  417.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull, preexec_fn = setsid)
  418.         except OSError:
  419.             return False
  420.  
  421.         return p.poll() is None
  422.  
  423.  
  424.  
  425. class Grail(BaseBrowser):
  426.     
  427.     def _find_grail_rc(self):
  428.         import glob
  429.         import pwd
  430.         import socket
  431.         import tempfile
  432.         tempdir = os.path.join(tempfile.gettempdir(), '.grail-unix')
  433.         user = pwd.getpwuid(os.getuid())[0]
  434.         filename = os.path.join(tempdir, user + '-*')
  435.         maybes = glob.glob(filename)
  436.         if not maybes:
  437.             return None
  438.         
  439.         s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  440.         for fn in maybes:
  441.             
  442.             try:
  443.                 s.connect(fn)
  444.             except socket.error:
  445.                 
  446.                 try:
  447.                     os.unlink(fn)
  448.                 except IOError:
  449.                     pass
  450.                 except:
  451.                     None<EXCEPTION MATCH>IOError
  452.                 
  453.  
  454.                 None<EXCEPTION MATCH>IOError
  455.  
  456.             return s
  457.         
  458.  
  459.     
  460.     def _remote(self, action):
  461.         s = self._find_grail_rc()
  462.         if not s:
  463.             return 0
  464.         
  465.         s.send(action)
  466.         s.close()
  467.         return 1
  468.  
  469.     
  470.     def open(self, url, new = 0, autoraise = 1):
  471.         if new:
  472.             ok = self._remote('LOADNEW ' + url)
  473.         else:
  474.             ok = self._remote('LOAD ' + url)
  475.         return ok
  476.  
  477.  
  478.  
  479. def register_X_browsers():
  480.     if _iscommand('gconftool-2'):
  481.         gc = 'gconftool-2 -g /desktop/gnome/url-handlers/http/command 2>/dev/null'
  482.         out = os.popen(gc)
  483.         commd = out.read().strip()
  484.         retncode = out.close()
  485.         if retncode is None and commd:
  486.             register('gnome', None, BackgroundBrowser(commd))
  487.         
  488.     
  489.     for browser in ('mozilla-firefox', 'firefox', 'mozilla-firebird', 'firebird', 'seamonkey', 'mozilla', 'netscape'):
  490.         if _iscommand(browser):
  491.             register(browser, None, Mozilla(browser))
  492.             continue
  493.     
  494.     if _iscommand('kfm'):
  495.         register('kfm', Konqueror, Konqueror('kfm'))
  496.     elif _iscommand('konqueror'):
  497.         register('konqueror', Konqueror, Konqueror('konqueror'))
  498.     
  499.     for browser in ('galeon', 'epiphany'):
  500.         if _iscommand(browser):
  501.             register(browser, None, Galeon(browser))
  502.             continue
  503.     
  504.     if _iscommand('skipstone'):
  505.         register('skipstone', None, BackgroundBrowser('skipstone'))
  506.     
  507.     if _iscommand('opera'):
  508.         register('opera', None, Opera('opera'))
  509.     
  510.     if _iscommand('mosaic'):
  511.         register('mosaic', None, BackgroundBrowser('mosaic'))
  512.     
  513.     if _iscommand('grail'):
  514.         register('grail', Grail, None)
  515.     
  516.  
  517. if os.environ.get('DISPLAY'):
  518.     register_X_browsers()
  519.  
  520. if os.environ.get('TERM'):
  521.     if _iscommand('links'):
  522.         register('links', None, GenericBrowser('links'))
  523.     
  524.     if _iscommand('elinks'):
  525.         register('elinks', None, Elinks('elinks'))
  526.     
  527.     if _iscommand('lynx'):
  528.         register('lynx', None, GenericBrowser('lynx'))
  529.     
  530.     if _iscommand('w3m'):
  531.         register('w3m', None, GenericBrowser('w3m'))
  532.     
  533.  
  534. if sys.platform[:3] == 'win':
  535.     
  536.     class WindowsDefault(BaseBrowser):
  537.         
  538.         def open(self, url, new = 0, autoraise = 1):
  539.             os.startfile(url)
  540.             return True
  541.  
  542.  
  543.     _tryorder = []
  544.     _browsers = { }
  545.     for browser in ('firefox', 'firebird', 'seamonkey', 'mozilla', 'netscape', 'opera'):
  546.         if _iscommand(browser):
  547.             register(browser, None, BackgroundBrowser(browser))
  548.             continue
  549.     
  550.     register('windows-default', WindowsDefault)
  551.  
  552.  
  553. try:
  554.     import ic
  555. except ImportError:
  556.     pass
  557.  
  558.  
  559. class InternetConfig(BaseBrowser):
  560.     
  561.     def open(self, url, new = 0, autoraise = 1):
  562.         ic.launchurl(url)
  563.         return True
  564.  
  565.  
  566. register('internet-config', InternetConfig, update_tryorder = -1)
  567. if sys.platform == 'darwin':
  568.     
  569.     class MacOSX(BaseBrowser):
  570.         '''Launcher class for Aqua browsers on Mac OS X
  571.  
  572.         Optionally specify a browser name on instantiation.  Note that this
  573.         will not work for Aqua browsers if the user has moved the application
  574.         package after installation.
  575.  
  576.         If no browser is specified, the default browser, as specified in the
  577.         Internet System Preferences panel, will be used.
  578.         '''
  579.         
  580.         def __init__(self, name):
  581.             self.name = name
  582.  
  583.         
  584.         def open(self, url, new = 0, autoraise = 1):
  585.             if not "'" not in url:
  586.                 raise AssertionError
  587.             if ':' not in url:
  588.                 url = 'file:' + url
  589.             
  590.             new = int(bool(new))
  591.             if self.name == 'default':
  592.                 script = 'open location "%s"' % url.replace('"', '%22')
  593.             elif self.name == 'OmniWeb':
  594.                 toWindow = ''
  595.             else:
  596.                 toWindow = 'toWindow %d' % (new - 1)
  597.             cmd = 'OpenURL "%s"' % url.replace('"', '%22')
  598.             script = 'tell application "%s"\n                                activate\n                                %s %s\n                            end tell' % (self.name, cmd, toWindow)
  599.             osapipe = os.popen('osascript', 'w')
  600.             if osapipe is None:
  601.                 return False
  602.             
  603.             osapipe.write(script)
  604.             rc = osapipe.close()
  605.             return not rc
  606.  
  607.  
  608.     register('MacOSX', None, MacOSX('default'), -1)
  609.  
  610. if sys.platform[:3] == 'os2' and _iscommand('netscape'):
  611.     _tryorder = []
  612.     _browsers = { }
  613.     register('os2netscape', None, GenericBrowser([
  614.         'start',
  615.         'netscape',
  616.         '%s']), -1)
  617.  
  618. if 'BROWSER' in os.environ:
  619.     _userchoices = os.environ['BROWSER'].split(os.pathsep)
  620.     _userchoices.reverse()
  621.     for cmdline in _userchoices:
  622.         if cmdline != '':
  623.             _synthesize(cmdline, -1)
  624.             continue
  625.     
  626.     cmdline = None
  627.     del cmdline
  628.     del _userchoices
  629.  
  630.  
  631. def main():
  632.     import getopt
  633.     usage = 'Usage: %s [-n | -t] url\n    -n: open new window\n    -t: open new tab' % sys.argv[0]
  634.     
  635.     try:
  636.         (opts, args) = getopt.getopt(sys.argv[1:], 'ntd')
  637.     except getopt.error:
  638.         msg = None
  639.         print >>sys.stderr, msg
  640.         print >>sys.stderr, usage
  641.         sys.exit(1)
  642.  
  643.     new_win = 0
  644.     for o, a in opts:
  645.         if o == '-n':
  646.             new_win = 1
  647.             continue
  648.         if o == '-t':
  649.             new_win = 2
  650.             continue
  651.     
  652.     if len(args) != 1:
  653.         print >>sys.stderr, usage
  654.         sys.exit(1)
  655.     
  656.     url = args[0]
  657.     open(url, new_win)
  658.     print '\x07'
  659.  
  660. if __name__ == '__main__':
  661.     main()
  662.  
  663.